﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace Aspfm.Dal
{
    public class DbTypeConvert
    {
        public static DbType GetDbType(string databaseType="VarChar")
        { 
            DbType resultDbtype = DbType.String;
            switch (databaseType.Trim().ToUpper())
            {
                //sqlserver
                case "BigInt": resultDbtype = DbType.Int64; break;
                case "Binary": resultDbtype = DbType.Binary; break;
                case "Bit": resultDbtype = DbType.Boolean; break;
                case "Char": resultDbtype = DbType.AnsiStringFixedLength; break;
                case "DateTime": resultDbtype = DbType.DateTime; break;
                case "Decimal": resultDbtype = DbType.Decimal; break;
                case "Float": resultDbtype = DbType.Double; break;
                case "Image": resultDbtype = DbType.Binary; break;
                case "Int": resultDbtype = DbType.Int32; break;
                case "Money": resultDbtype = DbType.Currency; break;
                case "NChar": resultDbtype = DbType.StringFixedLength; break;
                case "NText": resultDbtype = DbType.String; break;
                case "NVarChar": resultDbtype = DbType.String; break;
                case "Real": resultDbtype = DbType.Single; break;
                case "UniqueIdentifier": resultDbtype = DbType.Guid; break;
                case "SmallDateTime": resultDbtype = DbType.DateTime; break;
                case "SmallInt": resultDbtype = DbType.Int16; break;
                case "SmallMoney": resultDbtype = DbType.Currency; break;
                case "Text": resultDbtype = DbType.AnsiString; break;
                case "Timestamp": resultDbtype = DbType.Binary; break;
                case "TinyInt": resultDbtype = DbType.Byte; break;
                case "VarBinary": resultDbtype = DbType.Binary; break;
                case "VarChar": resultDbtype = DbType.AnsiString; break;
                case "Variant": resultDbtype = DbType.Object; break;
                case "Xml": resultDbtype = DbType.Xml; break;
                case "Udt": resultDbtype = DbType.Object; break;
                case "Structured": resultDbtype = DbType.Object; break;
                case "Date": resultDbtype = DbType.Date; break;
                case "Time": resultDbtype = DbType.Time; break;
                case "DateTime2": resultDbtype = DbType.DateTime2; break;
                case "DateTimeOffset": resultDbtype = DbType.DateTimeOffset; break;

                //oracle

                case "DECIMAL":
                case "NUMBER":
                case "LONG":
                case "INT":
                    resultDbtype = DbType.Int32;
                    break;
                case "DATE":
                case "DATETIME":
                    resultDbtype = DbType.Date;
                    break;
                case "BLOB":
                case "BYTE":
                    resultDbtype = DbType.Byte;
                    break;
                case "STRING":
                case "VARCHAR2":
                case "NVARCHAR2":
                case "NCHAR":
                case "CHAR":
                case "CLOB":
                default:
                    resultDbtype = DbType.String;
                    break;
                //case "NCHAR":
                //    resultDbtype = DbType.StringFixedLength;
                //    break;
                //case "STRING":
                //case "VARCHAR2":
                //    resultDbtype = DbType.String;
                //    break;
                //case "CHAR":
                //    resultDbtype = DbType.StringFixedLength;
                //    break;
                //case "NUMBER":
                //    resultDbtype = DbType.Decimal;
                //    break;
                //case "DATE":
                //    resultDbtype = DbType.Date;
                //    break;
                //case "LONG":
                //    //resultDbtype = DbType.Int64;
                //    resultDbtype = DbType.String;
                //    break;
                //case "BLOB":
                //    resultDbtype = DbType.Object;
                //    break;
                //case "CLOB":
                //    resultDbtype = DbType.Object;
                //    break;
            }
            return resultDbtype;

        }

        // sql server中的数据类型，转换为C#中的类型类型
        public static Type SqlTypeString2CsharpType(string sqlTypeString)
        {
            SqlDbType dbTpe = SqlTypeString2SqlType(sqlTypeString);

            return SqlType2CsharpType(dbTpe);
        }

        // 将sql server中的数据类型，转化为C#中的类型的字符串
        public static string SqlTypeString2CsharpTypeString(string sqlTypeString)
        {
            Type type = SqlTypeString2CsharpType(sqlTypeString);

            return type.Name;
        }
        // sql server数据类型（如：varchar）
        // 转换为SqlDbType类型
        public static SqlDbType SqlTypeString2SqlType(string sqlTypeString)
        {
            SqlDbType dbType = SqlDbType.Variant;//默认为Object

            switch (sqlTypeString)
            {
                case "int":
                    dbType = SqlDbType.Int;
                    break;
                case "varchar":
                    dbType = SqlDbType.VarChar;
                    break;
                case "bit":
                    dbType = SqlDbType.Bit;
                    break;
                case "datetime":
                    dbType = SqlDbType.DateTime;
                    break;
                case "decimal":
                    dbType = SqlDbType.Decimal;
                    break;
                case "float":
                    dbType = SqlDbType.Float;
                    break;
                case "image":
                    dbType = SqlDbType.Image;
                    break;
                case "money":
                    dbType = SqlDbType.Money;
                    break;
                case "ntext":
                    dbType = SqlDbType.NText;
                    break;
                case "nvarchar":
                    dbType = SqlDbType.NVarChar;
                    break;
                case "smalldatetime":
                    dbType = SqlDbType.SmallDateTime;
                    break;
                case "smallint":
                    dbType = SqlDbType.SmallInt;
                    break;
                case "text":
                    dbType = SqlDbType.Text;
                    break;
                case "bigint":
                    dbType = SqlDbType.BigInt;
                    break;
                case "binary":
                    dbType = SqlDbType.Binary;
                    break;
                case "char":
                    dbType = SqlDbType.Char;
                    break;
                case "nchar":
                    dbType = SqlDbType.NChar;
                    break;
                case "numeric":
                    dbType = SqlDbType.Decimal;
                    break;
                case "real":
                    dbType = SqlDbType.Real;
                    break;
                case "smallmoney":
                    dbType = SqlDbType.SmallMoney;
                    break;
                case "sql_variant":
                    dbType = SqlDbType.Variant;
                    break;
                case "timestamp":
                    dbType = SqlDbType.Timestamp;
                    break;
                case "tinyint":
                    dbType = SqlDbType.TinyInt;
                    break;
                case "uniqueidentifier":
                    dbType = SqlDbType.UniqueIdentifier;
                    break;
                case "varbinary":
                    dbType = SqlDbType.VarBinary;
                    break;
                case "xml":
                    dbType = SqlDbType.Xml;
                    break;
            }
            return dbType;
        }

        // SqlDbType转换为C#数据类型
        public static Type SqlType2CsharpType(SqlDbType sqlType)
        {
            switch (sqlType)
            {
                case SqlDbType.BigInt:
                    return typeof(Int64);
                case SqlDbType.Binary:
                    return typeof(Object);
                case SqlDbType.Bit:
                    return typeof(Boolean);
                case SqlDbType.Char:
                    return typeof(String);
                case SqlDbType.DateTime:
                    return typeof(DateTime);
                case SqlDbType.Decimal:
                    return typeof(Decimal);
                case SqlDbType.Float:
                    return typeof(Double);
                case SqlDbType.Image:
                    return typeof(Object);
                case SqlDbType.Int:
                    return typeof(Int32);
                case SqlDbType.Money:
                    return typeof(Decimal);
                case SqlDbType.NChar:
                    return typeof(String);
                case SqlDbType.NText:
                    return typeof(String);
                case SqlDbType.NVarChar:
                    return typeof(String);
                case SqlDbType.Real:
                    return typeof(Single);
                case SqlDbType.SmallDateTime:
                    return typeof(DateTime);
                case SqlDbType.SmallInt:
                    return typeof(Int16);
                case SqlDbType.SmallMoney:
                    return typeof(Decimal);
                case SqlDbType.Text:
                    return typeof(String);
                case SqlDbType.Timestamp:
                    return typeof(Object);
                case SqlDbType.TinyInt:
                    return typeof(Byte);
                case SqlDbType.Udt://自定义的数据类型
                    return typeof(Object);
                case SqlDbType.UniqueIdentifier:
                    return typeof(Object);
                case SqlDbType.VarBinary:
                    return typeof(Object);
                case SqlDbType.VarChar:
                    return typeof(String);
                case SqlDbType.Variant:
                    return typeof(Object);
                case SqlDbType.Xml:
                    return typeof(Object);
                default:
                    return null;
            }
        }
    }
}
